package StudentSystem;

import com.sun.source.tree.ContinueTree;

import java.awt.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;
//将题目分成几个模块，根据每个模块的要求具体分析，共同的行为可以写成一个共同的方法
public class App {
    public static void main(String[] args) {
        ArrayList<User> list = new ArrayList<User>();
        Scanner scanner = new Scanner(System.in);
        while (true) {
            System.out.println("欢迎来到学生管理系统");
            System.out.println("请选择操作：1.登录 2.注册 3.忘记密码 4.退出");
            String choice = scanner.nextLine();
            switch (choice) {
                case "1" -> login(list);
                case "2" -> register(list);
                case "3" -> forgetPassword(list);
                case "4" -> {
                    System.out.println("谢谢使用，再见");
                    System.exit(0);
                }
                default -> System.out.println("没有这个选项");
            }
        }
    }

    private static void forgetPassword(ArrayList<User> list) {
        System.out.println("忘记密码");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入用户名");
        String username = scanner.nextLine();
        boolean flag = contains(list,username);
        if(!flag){
            System.out.println("用户名"+username+"未注册，请先注册登录");
            return;
        }
        System.out.println("请输入身份证号码");
        String personID = scanner.nextLine();
        System.out.println("请输入手机号码");
        String phoneNumber = scanner.nextLine();
        int index = findIndex(list,username);
        User user = list.get(index);
        //取反大部分可以避免复杂的嵌套，提高阅读性
        if(!(user.getPersonID().equalsIgnoreCase(personID) && user.getPhoneNumber().equalsIgnoreCase(phoneNumber))){
            System.out.println("身份证号码或手机号码输入有误，不能修改密码");
            return;
        }
        //执行到这里表示所有数据全部验证成功，直接修改即可
        String password;
        while (true) {
            System.out.println("请输入新的密码");
            password = scanner.nextLine();
            System.out.println("请再次输入新的密码");
            String againPassword = scanner.nextLine();
            if(password.equals(againPassword)){
                System.out.println("两次输入密码一致");
                break;
            }else {
                System.out.println("两次输入密码不一致，请重新输入");
                continue;
            }
        }
        user.setPassword(password);
    }

    private static int findIndex(ArrayList<User> list, String username) {
        for (int i = 0; i < list.size(); i++) {
            User user = list.get(i);
            if(username.equals(user.getUsername())){
                return i;
            }
        }
        return -1;
    }

    private static void register(ArrayList<User> list) {
        String username;
        String password;
        String personID;
        String phoneNumber;
        System.out.println("注册");
        Scanner scanner = new Scanner(System.in);
        //在重复循环中，保证阅读性要有一个break，一个continue
        while (true) {
            System.out.println("请输入用户名");
            username = scanner.nextLine();
            //用户名唯一
            //用户名长度必须在3~15位之间
            //只能是字母加数字的组合，但是不能是纯数字
            //先验证格式是否正确，再验证是否唯一
            //因为数据都存储在数据库中，如果要校验需要使用到网络资源，消耗资源的代码都放在最后实现，格式检验单机就可以完成
            //检验格式
            boolean flag1 = checkUsername(username);
            if(!flag1){
                System.out.println("用户名格式不满足条件，请重新输入");
                //continue直接跳过下面重新循环！！！！！
                continue;
            }
            //检验是否唯一
            boolean flag2 = contains(list,username);
            if(flag2){
                System.out.println("用户名"+username+"已存在，请重新输入");
                continue;
            }else {
                System.out.println("用户名"+username+"可用");
                break;
            }
        }
        while (true) {
            System.out.println("请输入要注册的密码");
            password = scanner.nextLine();
            System.out.println("请在此输入要注册的密码");
            String againPassword = scanner.nextLine();
            if(password.equals(againPassword)){
                System.out.println("两次密码一致，继续录入其他数据");
                break;
            }else {
                System.out.println("两次密码输入不一致，请重新输入");
                continue;
            }
        }
        while (true) {
            System.out.println("请输入身份证号码");
            personID = scanner.nextLine();
            boolean flag = checkPersonID(personID);
            if(!flag){
                System.out.println("身份证格式有误，请重新输入");
                continue;
            }else {
                System.out.println("身份证号码满足要求");
                break;
            }
        }
        while (true) {
            System.out.println("请输入手机号码");
            phoneNumber = scanner.nextLine();
            boolean flag = checkPhoneNumber(phoneNumber);
            if(!flag){
                System.out.println("手机格式有误，请重新输入");
                continue;
            }else {
                System.out.println("手机号码格式正确");
                break;
            }
        }
        User u = new User(username,password,personID,phoneNumber);
        list.add(u);
        System.out.println("注册成功");
        printList(list);
    }

    private static void printList(ArrayList<User> list) {
        for (int i = 0; i < list.size(); i++) {
            User user = list.get(i);
            System.out.println("username:"+user.getUsername()+" password:"+
                    user.getPassword()+" personID:"+user.getPersonID()+" phoneNumber:"+user.getPhoneNumber());
        }
    }

    private static boolean checkPhoneNumber(String phoneNumber) {
        if(phoneNumber.length() != 11){
            return false;
        }
        if(phoneNumber.startsWith("0")){
            return false;
        }
        for (int i = 0; i < phoneNumber.length(); i++) {
            char c = phoneNumber.charAt(i);
            if(!(c >= '0' && c <= '9')){
                return false;
            }
        }
        return true;
    }

    private static boolean checkPersonID(String personID) {
        if(personID.length() != 18){
            return false;
        }
        if(personID.startsWith("0")){
            return false;
        }
        for (int i = 0; i < personID.length() - 1; i++) {
            char ch = personID.charAt(i);
            if(!(ch >= '0' && ch <= '9')){
                return false;
            }
        }
        char endChar = personID.charAt(personID.length() - 1);
        if((endChar >= '0' && endChar <= '9') || endChar == 'x' || endChar == 'X'){
            return true;
        }else return false;
    }

    private static boolean contains(ArrayList<User> list, String username) {
        for (int i = 0; i < list.size(); i++) {
            User user = list.get(i);
            if (username.equals(user.getUsername())) {
                return true;
            }
        }
        return false;
    }

    private static boolean checkUsername(String username) {
        int length = username.length();
        //定义一变量可以提高效率，避免像下行代码一样length（）方法调用了两次
        //if(username.length() < 3 || username.length() > 15) {}
        if (length < 3 || length > 15) {
            return false;
        }
        for (int i = 0; i < username.length(); i++) {
            char c = username.charAt(i);
            if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9'))) {
                return false;
            }
        }
            int count = 0;
            for (int i1 = 0; i1 < username.length(); i1++) {
                char c = username.charAt(i1);
                if((c>='a' && c<='z') || (c>='A' && c<='Z') ){
                    count++;
                    break;
                }
            }
            //因为最后一个判断条件，可以采取向下方一样的选择返回
            return count > 0;
            //判断方法可以采取反向条件作为判断条件，
        //按顺序进行判断，不符合条件就return flase 可以呈线性顺下来判断
        //如果就按需求条件作为判断条件需要一直用if内嵌找return true
    }

    private static void login(ArrayList<User> list) {
        System.out.println("登录");
        Scanner scanner = new Scanner(System.in);
        for (int i = 0; i < 3; i++) {
            System.out.println("请输入用户名");
            String username = scanner.nextLine();
            boolean flag = contains(list,username);
            if(!flag){
                System.out.println("用户名"+username+"未注册，请先注册登录");
                return;
            }
            System.out.println("请输入密码");
            String password = scanner.nextLine();
            while (true) {
                String rightCode = getcode();
                System.out.println("当前验证码为："+rightCode);
                System.out.println("请输入验证码");
                String code = scanner.nextLine();
                if(rightCode.equalsIgnoreCase(code)){
                    System.out.println("验证码正确");
                    break;
                }else {
                    System.out.println("验证码错误");
                    continue;
                }
            }
            //封装思想的应用：
            //可以把零散的数据封装成一个对象
            //以后传递参数的时候，只需要传递一个整体就行，不需要管这些零散数据
            User useInfo = new User(username,password,null,null);
            boolean flag1 = checkUserInfo(list,useInfo);
            if(flag1){
                System.out.println("登录成功，可以开始使用学生管理系统");
                //创建对象体调用方法，启动学生管理系统
                StudentSystem ss = new StudentSystem();
                ss.startStudentSystem();
                break;
            }else {
                System.out.println("登录失败，用户名或密码错误");
                if(i==2){
                    System.out.println("当前帐号"+username+"被锁定,请联系夕下流苏月");
                    return;
                }else {
                    System.out.println("还剩下"+(2 - i)+"次机会");
                }
            }
        }

    }

    private static boolean checkUserInfo(ArrayList<User>list,User useInfo) {
        for (int i = 0; i < list.size(); i++) {
            User user = list.get(i);
            if (useInfo.getUsername().equals(user.getUsername()) && useInfo.getPassword().equals(user.getPassword())) {
                return true;
            }
        }
        return false;
    }

    private static String getcode(){
        ArrayList<Character> list = new ArrayList<>();
        for (int i = 0; i < 26; i++) {
            list.add((char) ('a' + i));//'a' + 1 = (char)98 = 'b'
            list.add((char) ('A' + i));
        }
        StringBuilder sb = new StringBuilder();
        Random r = new Random();
        for (int i = 0; i < 4; i++) {
            int index = r.nextInt(list.size());
            char ch = list.get(index);
            sb.append(ch);
        }
        int number = r.nextInt(10);
        sb.append(number);
        //通过数组修改字符串内容交换位置
        char[] arr = sb.toString().toCharArray();
        int randomIndex = r.nextInt(arr.length);
        char temp = arr[randomIndex];
        arr[randomIndex] = arr[arr.length - 1];
        arr[arr.length - 1] = temp;
        return new String(arr);
    }
}
